Home
Wrong Floor
[ In Progress ]
A survival shooter game available to wishlist on Steam now.

Video Coming Soon

The project information is divided into the following sections.

What is it?

• A soon to be released horror survival shooter, where the player has to fight off floors full of zombies while being trapped in an elevator.
• It features multiple guns and power-ups to aid the player, as well as, a plethora of distractions and mini-games/tasks which prevent the player from concentrating on the oncoming gang of zombies.
• I have implemented the entire programming end of the project using Unity Engine and C#, with design and art being the responsibility of a colleague (Jeremy Varcl). We also teamed up with some game testers to ensure the game is polished and bug-free.

Motivation

• This project started as a game jam submission, but then quickly evolved into a release focused game as we (me and jeremy) liked the elevator-bound-survival game idea.
• It also serves the purpose of sharpening my team development and leadership skills, and it has also introduced me to the process of formally releasing a game.

Work Done

• Implemented player behaviour, movement, shooting, and environment interaction.
• Programmed audio, dialogue, and subtitles components and made sure they are properly in-sync with the gameplay.
• Created enemy AI, main game loop, player power-ups, abilities, distractions, and setup animations when needed.
• Designed and implemented VFX using Unity's particle systems.
• Programmed and designed the UI.
• Created a leaderboard system to track player scores and promote competition, using Unity's leaderboard services.
• Acted as a de-facto producer and team lead, managing the project timeline, tasks, and team communication.

Code Example The script (CameraWipeOut.cs) creates an interactive wiping effect on the camera overlay. As the player clicks and drags, sprite masks are instantiated where the cursor hits, gradually "clearing" steam or any screen wide distractions. Once a threshold of cleared area is reached, the overlay is removed. This mechanic combines raycasting, physics colliders, and procedural instantiation. void Update() { var mousePos = Input.mousePosition; mousePos.z = Camera.main.nearClipPlane; Ray ray = Camera.main.ScreenPointToRay(mousePos); RaycastHit hit; if (Input.GetKey(KeyCode.Mouse0)) isPressed = true; else if (Input.GetKeyUp(KeyCode.Mouse0)) isPressed = false; if (Physics.Raycast(ray, out hit) && isPressed) { if (hit.transform.CompareTag("CameraOverlay")) { var mask = Instantiate(spriteMaskPrefab, hit.point, Quaternion.identity); mask.transform.SetParent(steam, true); mask.transform.localPosition = new Vector3(mask.transform.localPosition.x, mask.transform.localPosition.y, -0.2f); mask.transform.rotation = steam.rotation; masks.Add(mask); if (CheckCleared()) { wiped = true; foreach(var maskItem in masks) { maskItem.GetComponent<BoxCollider>().enabled = false; Destroy(maskItem, 3); } } } } } bool CheckCleared() { clearedArea = 0; foreach (var mask in masks) { if (mask != null && mask.TryGetComponent<BoxCollider>(out var maskCollider)) clearedArea += maskCollider.bounds.size.x * maskCollider.bounds.size.y; } ratio = clearedArea / steamArea; return ratio >= clearThreshold; } Full Script (GitHub)
Photos Pumpkin Distraction: Laser Gun Power-Up: Death Screen: Train Station Level: Security Code Distraction: Leaderboard (with example data values):
More details can be provided upon request.


Steam Page

Repository Link